package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;

/**
 * @Name InstantiationAwareBeanPostProcessor
 * @Description:
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-03-29 17:13:11
 **/
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    /**
     * 在 Bean 实例化之前执行该方法
     *
     * @param beanClass Bean 类
     * @param beanName  Bean 名称
     * @return java.lang.Object 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-10 15:48:24
     */
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

    /**
     * 在 Bean 实例化之后，属性设置之前执行该方法
     *
     * @param bean     Bean 实例
     * @param beanName Bean 名称
     * @return boolean 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-10 17:20:57
     */
    boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

    /**
     * 在 Bean 实例化之后，设置属性之前执行该方法
     *
     * @param pvs      属性值集合
     * @param bean     Bean 实例
     * @param beanName Bean 名称
     * @return org.springframework.beans.PropertyValues 属性值集合
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-10 15:49:43
     */
    PropertyValues postProcessPropertyValues(PropertyValues pvs, Object bean, String beanName) throws BeansException;

    /**
     * 获取二级缓存 earlySingletonObjects 中的 Bean 实例的引用
     * 目的：提前暴露 Bean 实例，以解决 Bean 实例循环依赖问题。
     *
     * @param bean 需要暴露的 Bean 实例
     * @param beanName      需要暴露的 Bean 名称
     * @return java.lang.Object Bean 实例的引用
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-12 15:06:20
     */
    default Object getEarlyBeanReference(Object bean, String beanName) {
        return bean;
    }
}
